/*
* Sistema de Ouvidoria: um canal através do qual os usuários
* podem encaminhar suas reclamações, elogios e sugestões.
*
* Copyright (C) 2011 SERPRO
*
* Este programa é software livre; você pode redistribuí-lo e/ou
* modificá-lo sob os termos da Licença Pública Geral GNU, conforme
* publicada pela Free Software Foundation; tanto a versão 2 da
* Licença como (a seu critério) qualquer versão mais nova.
*
* Este programa é distribuído na expectativa de ser útil, mas SEM
* QUALQUER GARANTIA; sem mesmo a garantia implícita de
* COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM
* PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais
* detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral GNU,
* sob o título "LICENCA.txt", junto com esse programa. Se não,
* acesse o Portal do Software Público Brasileiro no endereço
* http://www.softwarepublico.gov.br/ ou escreva para a Fundação do
* Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
* MA 02111-1301, USA.
*
* Contatos através do seguinte endereço internet:
* http://www.serpro.gov.br/sistemaouvidoria/
*/
package br.gov.serpro.ouvidoria.util;
import java.awt.Color;
import java.awt.Font;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.Map;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.Legend;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.CategoryLabelGenerator;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.Layer;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.TextAnchor;
import br.gov.serpro.ouvidoria.util.freechart.data.EnhancedJDBCPieDataset;
import br.gov.serpro.ouvidoria.util.freechart.data.JDBCFlatCategoryDataset;
import br.gov.serpro.ouvidoria.util.freechart.labels.PercentCategoryLabelGenerator;
import de.laures.cewolf.ChartPostProcessor;
/**
*
* @author SERPRO
* @version $Revision: 1.1.2.4 $, $Date: 2011/10/21 18:53:46 $
* @version 0.1, Date: 2005/01/21
*/
public class PlotEnhancer implements ChartPostProcessor, Serializable {
private static final long serialVersionUID = 1L;
static final String NO_DATA_FOUND = "*** NENHUM DADO ENCONTRADO ***";
public static final Color[] COLORS = Strings2Colors(ReportKit
.getColorList());
public PlotEnhancer() {
// DO NOTHING
}
public void processChart(Object chart, Map params) {
JFreeChart jfc = (JFreeChart) chart;
jfc.setLegend(Legend.createInstance(jfc));
jfc.getLegend().setAnchor(Legend.SOUTH);
String subTitle = (String) params.get("local");
if (subTitle != null) {
try {
subTitle = ReportKit.getLocationCaption(subTitle);
} catch (SQLException e) {
e.printStackTrace();
}
jfc.addSubtitle(new TextTitle(subTitle));
}
Plot plot = (jfc.getPlot());
plot.setNoDataMessage(NO_DATA_FOUND);
if (plot instanceof PiePlot) {
enhancePlot((PiePlot) plot, params);
} else {
plot = enhancePlot((CategoryPlot) plot, params);
}
}
private void enhancePlot(PiePlot plot, Map params) {
plot.setForegroundAlpha(0.7f);
PieDataset dataset = plot.getDataset();
PieSectionLabelGenerator spilg = null;
if (dataset instanceof EnhancedJDBCPieDataset) {
EnhancedJDBCPieDataset ds = (EnhancedJDBCPieDataset) dataset;
spilg = ds.getLabelGenerator();
if (spilg == null) {
spilg = new StandardPieItemLabelGenerator("{0}: {2} [ {1} ]");
((StandardPieItemLabelGenerator) spilg).getPercentFormat()
.setMinimumFractionDigits(2);
}
}
plot.setLabelGenerator("true".equalsIgnoreCase((String) params
.get("supressLabels")) ? null : spilg);
setSectionPaints(COLORS, plot);
}
private Plot enhancePlot(CategoryPlot plot, Map params) {
String txt_meta = (String) params.get("txt_meta");
Double targetValue = txt_meta == null || txt_meta.length() < 1 ? null
: new Double(txt_meta);
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setCategoryMargin(.15d);
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setUpperMargin(.45d); //.08dpi
rangeAxis.setLowerMargin(.02d);
rangeAxis.setLabel(!"ext".equals(params.get("indicador")) ? "%" : "2"
.equals(params.get("sel_indicador")) ? "Tempo" : "Total");
if (targetValue != null) {
double tv = targetValue.doubleValue();
Double factor = (Double) params.get("factor");
if (factor != null) {
tv *= factor.doubleValue();
}
if (rangeAxis.getUpperBound() < tv)
rangeAxis.setUpperBound(tv);
ValueMarker marker = new ValueMarker(tv);
marker.setLabel("Meta");
marker.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
marker.setLabelAnchor(RectangleAnchor.LEFT);
marker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
marker.setPaint(new Color(222, 222, 255, 128));
plot.addRangeMarker(marker, Layer.BACKGROUND);
}
CategoryItemRenderer renderer = plot.getRenderer();
renderer.setItemLabelFont(new Font("SansSerif", Font.BOLD, 8));
CategoryLabelGenerator clg = null;
CategoryDataset dataset = plot.getDataset();
if (dataset instanceof JDBCFlatCategoryDataset) {
JDBCFlatCategoryDataset ds = (JDBCFlatCategoryDataset) dataset;
clg = ds.getLabelGenerator();
if (clg == null) {
clg = new PercentCategoryLabelGenerator(100d / ds
.getGrandTotal());
PercentCategoryLabelGenerator pclg = (PercentCategoryLabelGenerator) clg;
pclg.setPercentFormatter(NumberFormat.getNumberInstance());
pclg.getValueFormatter().setMinimumFractionDigits(2);
pclg.getValueFormatter().setMaximumFractionDigits(2);
pclg.setFormatString(" {0}% ({1})");
}
}
renderer.setLabelGenerator("true".equalsIgnoreCase((String) params
.get("supressLabels")) ? null : clg);
renderer.setItemLabelsVisible(!"true".equalsIgnoreCase((String) params
.get("supressLabels")));
ItemLabelPosition ilb_out = new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER_LEFT,
TextAnchor.CENTER_LEFT, -Math.PI / 2d);
ItemLabelPosition ilb_line = new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER_LEFT,
TextAnchor.CENTER_LEFT, -Math.PI / 4d);
renderer.setPositiveItemLabelPosition(ilb_out);
renderer.setNegativeItemLabelPosition(ilb_out);
if (renderer instanceof BarRenderer3D) {
plot.setForegroundAlpha(0.6f);
BarRenderer3D barRenderer3D = (BarRenderer3D) renderer;
barRenderer3D.setPositiveItemLabelPositionFallback(ilb_out);
barRenderer3D.setItemMargin(0.01d);
barRenderer3D.setMaxBarWidth(.4d);
} else if (renderer instanceof LineAndShapeRenderer) {
plot.setForegroundAlpha(0.9f);
LineAndShapeRenderer lineRenderer = (LineAndShapeRenderer) renderer;
lineRenderer.setPositiveItemLabelPosition(ilb_line);
}
setSeriesPaints(COLORS, renderer);
return plot;
}
public static void setSectionPaints(Color[] colors, PiePlot plot) {
for (int i = 0; i < colors.length; i++) {
plot.setSectionPaint(i, colors[i]);
}
}
public static void setSeriesPaints(Color[] colors,
CategoryItemRenderer renderer) {
for (int i = 0; i < colors.length; i++) {
renderer.setSeriesPaint(i, colors[i]);
}
}
public static Color[] Strings2Colors(String[] colors) {
Color[] result = new Color[colors.length];
String cor ="#000000";
for (int i = 0; i < colors.length; i++) {
if(colors[i].equals("")){
colors[i]=cor;
}
result[i] = Color.decode(colors[i]);
}
return result;
}
}